package com.tarena.sentinel.demo02.controller;

import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.tarena.sentinel.demo02.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @Autowired
    private HelloService helloService;
    @GetMapping("/hello")
    public String sayHi(String name){
        //sentinel对资源的定义,必须创建一个Entry对象
        Entry entry=null;
        try{
            //对入口做赋值,相当于获取资源进入的资格 定义资源的名称
            //赋值过程会检验 当前资源resource01是否触发了限流等规则,如果触发,直接抛BlockException
            entry= SphU.entry("resource01");
            //如果entry赋值成功,可以正常调用service方法
            //反之 entry赋值没有成功,会在sentinel框架抛出一个BlockException异常
            String result=helloService.sayHi(name);
            return result;
        }catch (BlockException e){
            //一旦捕获异常,说明entry入口进入失败
            //相当于进入了sentinel限流 等规则
            //退而求其次的返回一个降级逻辑,可用数据
            return "sorry,enter failed"; //进入资源失败
        }finally {
            //每次调用完 entry进行释放
            if (entry!=null) entry.exit();
        }
    }
}
